const fp = require("lodash/fp")
const { Container, MayBe } = require("./support.js")
let maybe = MayBe.of([5,6,1])
//练习1
//使用fp.add(x,y)和fp.map(f,x)创建一个能让functor里的值增加的函数ex1
let ex1 = (num) => {
    //传入fp.map(),并使用fp.add()让每个元素+num，同时返回处理后的函子
    return maybe.map((arr) => fp.map(item => fp.add(item,num), arr))
}
console.log(1,ex1(5))

//练习2
//实现一个函数ex2，能够使用fp.first获取列表的第一个元素
let xs = Container.of(['do','ray','me','fa','so','la','ti','do'])
let ex2 = (xs) => {
    //将fp.first传入函子中（不能是fp.first()）
    return xs.map(fp.first)
}
console.log(2,ex2(xs))

//练习3
//实现一个函数ex3，使用safeProp和fp.first找到user的名字的首字母
let safeProp = fp.curry(function (x, o) {
    return MayBe.of(o[x])
})
let user = {id:2,name:"Albert"}
let ex3 = (user) => {
    //柯里化，原来一次传入两个参数，现在要一个一个传safeProp(x)(o)
    //返回一个函子，调用其map()方法，修改其_value后，返回新的函子
    return safeProp("name")(user).map(fp.first)
}
console.log(3,ex3(user))

//练习4
//使用MayBe重写ex4，不要有if语句
// let ex4 = function (n) {
//     if(n){
//         return parseInt(n)
//     }
// }
let ex4 = function (n) {
    //不使用if需要修改MayBe函子
    return MayBe.of(n).map(num => parseInt(num))
}
console.log(4,ex4("55.66")._value)
